﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/// <summary>
/// 面向对象
/// </summary>
namespace _06_object_orientation
{
    class Program
    {
        static void Main(string[] args)
        {
            Dog dog = new Dog();
            dog.DoAction();
            dog.Say();

            /*
            Cell 构造函数
            Animal 构造函数
            Dog 构造函数
            Dog：DoAction
            Dog：Say 虚函数
            */
            Console.ReadKey();
        }
    }


    class Dog: Animal, Action
    {
        public Dog()
        {
            Console.WriteLine("Dog 构造函数");
        }

        public void DoAction()
        {
            Console.WriteLine("Dog：DoAction");
        }
        public override void Say()
        {
            //base.Say();
            Console.WriteLine("Dog：Say 虚函数");
        }
    }

    class Animal : Cell
    {
        public Animal()
        {
            Console.WriteLine("Animal 构造函数");
        }

        /// <summary>
        /// 重写抽象类抽象方法必须添加 override 关键字！
        /// </summary>
        public override void Move()
        {
            Console.WriteLine("Move 方法");
        }
    }

    abstract class Cell
    {
        public Cell()
        {
            Console.WriteLine("Cell 构造函数");
        }

        public abstract void Move();

        /// <summary>
        /// 虚函数做了一个实现，子类可以选择重写也可以不重写
        /// </summary>
        public virtual void Say()
        {
            Console.WriteLine("Say 虚函数");
        }

    }

    /// <summary>
    /// 接口的特点:
    /// 1. 接口不允许使用任意修饰符默认就是 public
    /// 2. 接口可以继承多个接口
    /// 3. 接口可以有成员属性
    /// 4. 子类继承的父类和接口中的方法重名的时候显示使用接口的方法,并重写
    ///     IFlayable.say(){XXXX;}
    /// </summary>
    interface Action
    {
        void DoAction();
    }

}
